package momo.multitree.algo;

import momo.multitree.structure.*;

import java.util.Collection;

import junit.framework.TestCase;


public class StabilityOptCalTest extends TestCase
{
	public void testCase_1()
	{
		Node node1 = new Node("1", 1, 1);
		Node node2 = new Node("2", 1, 6);
		Node node3 = new Node("3", 1, 4);
		Node node4 = new Node("4", 1, 5);
		Node node5 = new Node("5", 1, 4);
		Node node6 = new Node("6", 1, 3);
		Node node7 = new Node("7", 1, 4);
		Node node8 = new Node("8", 1, 2);
		
		Edge edge1 = new Edge("1", node1, node2, 1, 1, 1, 1);
		Edge edge2 = new Edge("2", node1, node3, 1, 1, 1, 1);
		Edge edge3 = new Edge("3", node1, node4, 1, 1, 1, 1);
		Edge edge4 = new Edge("4", node2, node5, 1, 1, 1, 1);
		Edge edge5 = new Edge("5", node3, node6, 1, 1, 1, 1);
		Edge edge6 = new Edge("6", node4, node7, 1, 1, 1, 1);
		Edge edge7 = new Edge("7", node8, node5, 1, 1, 1, 1);
		Edge edge8 = new Edge("8", node8, node6, 1, 1, 1, 1);
		Edge edge9 = new Edge("9", node8, node7, 1, 1, 1, 1);
		
		Graph graph = new Graph();
		graph.add(edge1);
		graph.add(edge2);
		graph.add(edge3);
		graph.add(edge4);
		graph.add(edge5);
		graph.add(edge6);
		graph.add(edge7);
		graph.add(edge8);
		graph.add(edge9);
		
//		CombinationAlgo combiAlgo = new CombinationAlgo();
//		Collection<Tree> sets = combiAlgo.enumerateAllSpanningTree(graph);
//		
//		double min = Double.MAX_VALUE;
//		for(Tree tree: sets)
//		{
//			double currMin = tree.compStability();
//			if ( currMin < min )
//				min = currMin; 
//		}
//		
//		StabilityOptCal app = new StabilityOptCal();
//		Tree algoTree = app.optimumTree(graph);
//		double algoMin = algoTree.compStability();
//		
//		assertEquals(min, algoMin, 0.0000001);
		
	}
	
	public void testCase_2()
	{
		Node node1 = new Node("1", 1, 7);
		Node node2 = new Node("2", 1, 6);
		Node node3 = new Node("3", 1, 4);
		Node node4 = new Node("4", 1, 5);
		Node node5 = new Node("5", 1, 1);
		Node node6 = new Node("6", 1, 3);
		Node node7 = new Node("7", 1, 4);
		Node node8 = new Node("8", 1, 2);
		Node node9 = new Node("9", 1, 9);
		
		Edge edge1 = new Edge("1", node1, node2, 1, 1, 1, 1);
		Edge edge2 = new Edge("2", node1, node3, 1, 1, 1, 1);
		Edge edge3 = new Edge("3", node1, node4, 1, 1, 1, 1);
		
		Edge edge4 = new Edge("4", node2, node4, 1, 1, 1, 1);
		Edge edge5 = new Edge("5", node2, node5, 1, 1, 1, 1);
		Edge edge6 = new Edge("6", node2, node6, 1, 1, 1, 1);
		Edge edge7 = new Edge("7", node2, node3, 1, 1, 1, 1);
		
		Edge edge8 = new Edge("8", node3, node5, 1, 1, 1, 1);
		Edge edge9 = new Edge("9", node3, node6, 1, 1, 1, 1);
		
		Edge edge10 = new Edge("10", node4, node5, 1, 1, 1, 1);
		Edge edge11 = new Edge("11", node4, node8, 1, 1, 1, 1);
		Edge edge12 = new Edge("12", node4, node7, 1, 1, 1, 1);
		
		Edge edge13 = new Edge("13", node5, node7, 1, 1, 1, 1);
		Edge edge14 = new Edge("14", node5, node8, 1, 1, 1, 1);
		Edge edge15 = new Edge("15", node5, node9, 1, 1, 1, 1);
		Edge edge16 = new Edge("16", node5, node6, 1, 1, 1, 1);
		
		Edge edge17 = new Edge("17", node6, node8, 1, 1, 1, 1);
		Edge edge18 = new Edge("18", node6, node9, 1, 1, 1, 1);
		
		Edge edge19 = new Edge("19", node8, node7, 1, 1, 1, 1);
		Edge edge20 = new Edge("20", node8, node9, 1, 1, 1, 1);
		
		Graph graph = new Graph();
		graph.add(edge1);
		graph.add(edge2);
		graph.add(edge3);
		graph.add(edge4);
		graph.add(edge5);
		graph.add(edge6);
		graph.add(edge7);
		graph.add(edge8);
		graph.add(edge9);
		graph.add(edge10);
		graph.add(edge11);
		graph.add(edge12);
		graph.add(edge13);
		graph.add(edge14);
		graph.add(edge15);
		graph.add(edge16);
		graph.add(edge17);
		graph.add(edge18);
		graph.add(edge19);
		graph.add(edge20);
		
//		CombinationAlgo combiAlgo = new CombinationAlgo();
//		double minOfAlgo = combiAlgo.getMin(graph);
//		
//		StabilityOptCal app = new StabilityOptCal();
//		Tree algoTree = app.optimumTree(graph);
//		double algoMin = algoTree.compStability();
//		
//		System.out.println(minOfAlgo);
//		System.out.println(algoMin);
//		
//		assertEquals(minOfAlgo, algoMin, 0.0000001);
		
	}
	
	public void testCase_3()
	{
		Node node1 = new Node("1", 1, 7);
		Node node2 = new Node("2", 1, 6);
		Node node3 = new Node("3", 1, 4);
		Node node4 = new Node("4", 1, 5);
		Node node5 = new Node("5", 1, 1);
		Node node6 = new Node("6", 1, 3);
		Node node7 = new Node("7", 1, 4);
		Node node8 = new Node("8", 1, 2);
		Node node9 = new Node("9", 1, 9);
		Node node10 = new Node("10", 1, 9);
		Node node11 = new Node("11", 1, 9);
		Node node12 = new Node("12", 1, 9);
		Node node13 = new Node("13", 1, 9);
		Node node14 = new Node("14", 1, 9);
		Node node15 = new Node("15", 1, 9);
		Node node16 = new Node("16", 1, 9);
		
		Edge edge1 = new Edge("1", node1, node2, 1, 1, 1, 1);
		Edge edge2 = new Edge("2", node1, node6, 1, 1, 1, 1);
		Edge edge3 = new Edge("3", node1, node5, 1, 1, 1, 1);
		
		Edge edge4 = new Edge("4", node2, node7, 1, 1, 1, 1);
		Edge edge5 = new Edge("5", node2, node5, 1, 1, 1, 1);
		Edge edge6 = new Edge("6", node2, node6, 1, 1, 1, 1);
		Edge edge7 = new Edge("7", node2, node3, 1, 1, 1, 1);
		
		Edge edge8 = new Edge("8", node3, node6, 1, 1, 1, 1);
		Edge edge9 = new Edge("9", node3, node7, 1, 1, 1, 1);
		Edge edge10 = new Edge("10", node3, node8, 1, 1, 1, 1);
		Edge edge11 = new Edge("11", node3, node4, 1, 1, 1, 1);
		
		Edge edge12 = new Edge("12", node4, node8, 1, 1, 1, 1);
		Edge edge13 = new Edge("13", node4, node7, 1, 1, 1, 1);
		
		Edge edge14 = new Edge("14", node5, node10, 1, 1, 1, 1);
		Edge edge15 = new Edge("15", node5, node9, 1, 1, 1, 1);
		Edge edge16 = new Edge("16", node5, node6, 1, 1, 1, 1);
		
		Edge edge17 = new Edge("17", node6, node9, 1, 1, 1, 1);
		Edge edge18 = new Edge("18", node6, node10, 1, 1, 1, 1);
		Edge edge19 = new Edge("19", node6, node11, 1, 1, 1, 1);
		Edge edge20 = new Edge("20", node6, node7, 1, 1, 1, 1);
		
		Edge edge21 = new Edge("21", node7, node10, 1, 1, 1, 1);
		Edge edge22 = new Edge("22", node7, node11, 1, 1, 1, 1);
		Edge edge23 = new Edge("23", node7, node12, 1, 1, 1, 1);
		Edge edge24 = new Edge("24", node7, node8, 1, 1, 1, 1);
		
		Edge edge25 = new Edge("25", node8, node12, 1, 1, 1, 1);
		Edge edge26 = new Edge("26", node8, node11, 1, 1, 1, 1);
		
		Edge edge27 = new Edge("27", node9, node13, 1, 1, 1, 1);
		Edge edge28 = new Edge("28", node9, node14, 1, 1, 1, 1);
		Edge edge29 = new Edge("29", node9, node10, 1, 1, 1, 1);
		
		Edge edge30 = new Edge("30", node10, node13, 1, 1, 1, 1);
		Edge edge31 = new Edge("31", node10, node14, 1, 1, 1, 1);
		Edge edge32 = new Edge("32", node10, node15, 1, 1, 1, 1);
		Edge edge33 = new Edge("33", node10, node11, 1, 1, 1, 1);
		
		Edge edge34 = new Edge("34", node11, node14, 1, 1, 1, 1);
		Edge edge35 = new Edge("35", node11, node15, 1, 1, 1, 1);
		Edge edge36 = new Edge("36", node11, node16, 1, 1, 1, 1);
		Edge edge37 = new Edge("37", node11, node12, 1, 1, 1, 1);
		
		Edge edge38 = new Edge("38", node12, node15, 1, 1, 1, 1);
		Edge edge39 = new Edge("39", node12, node16, 1, 1, 1, 1);
		
		Edge edge40 = new Edge("40", node13, node14, 1, 1, 1, 1);
		Edge edge41 = new Edge("41", node14, node15, 1, 1, 1, 1);
		Edge edge42 = new Edge("42", node15, node16, 1, 1, 1, 1);
		
		Graph graph = new Graph();
		graph.add(edge1);
		graph.add(edge2);
		graph.add(edge3);
		graph.add(edge4);
		graph.add(edge5);
		graph.add(edge6);
		graph.add(edge7);
		graph.add(edge8);
		graph.add(edge9);
		graph.add(edge10);
		graph.add(edge11);
		graph.add(edge12);
		graph.add(edge13);
		graph.add(edge14);
		graph.add(edge15);
		graph.add(edge16);
		graph.add(edge17);
		graph.add(edge18);
		graph.add(edge19);
		graph.add(edge20);
		graph.add(edge21);
		graph.add(edge22);
		graph.add(edge23);
		graph.add(edge24);
		graph.add(edge25);
		graph.add(edge26);
		graph.add(edge27);
		graph.add(edge28);
		graph.add(edge29);
		graph.add(edge30);
		graph.add(edge31);
		graph.add(edge32);
		graph.add(edge33);
		graph.add(edge34);
		graph.add(edge35);
		graph.add(edge36);
		graph.add(edge37);
		graph.add(edge38);
		graph.add(edge39);
		graph.add(edge40);
		graph.add(edge41);
		graph.add(edge42);
		
//		CombinationAlgo combiAlgo = new CombinationAlgo();
//		double minOfAlgo = combiAlgo.getMin(graph);
		
		StabilityOptCal app = new StabilityOptCal();
		Tree algoTree = app.optimumTree(graph);
		double algoMin = algoTree.compStability();
		
//		System.out.println(minOfAlgo);
		System.out.println(algoMin);
		
//		assertEquals(minOfAlgo, algoMin, 0.0000001);
		
	}
}
